<?php

namespace DeCMF\Core\Db;

use DeCMF\Core\Config\Attribute\Enum;

/**
 * 字段属性定义
 * 
 * 对自定义字段对应的db自动类型进行了定义
 */
class Attribute
{
    const NUM = 'num';
    
    const STRING = 'string';
    
    const TEXTAREA = 'textarea';
    
    const DATE = 'date';
    
    const DATETIME = 'datetime';
    
    const BOOL = 'bool';
    
    const SELECT = 'select';
    
    const RADIO = 'radio';
    
    const CHECKBOX = 'checkbox';
    
    const EDITOR = 'editor';
    
    const FILE = 'file';
    
    const PICTURE = 'picture';
    
    protected static $types = array(
        self::NUM => array(
            '数字',
            'int(10) UNSIGNED NOT NULL'
        ),
        self::STRING => array(
            '字符串',
            'varchar(255) NOT NULL'
        ),
        self::TEXTAREA => array(
            '文本框',
            'text NOT NULL'
        ),
        self::DATE => array(
            '日期',
            'int(10) NOT NULL'
        ),
        self::DATETIME => array(
            '时间',
            'int(10) NOT NULL'
        ),
        self::BOOL => array(
            '布尔',
            'tinyint(2) NOT NULL'
        ),
        self::SELECT => array(
            '枚举',
            'char(50) NOT NULL'
        ),
        self::RADIO => array(
            '单选',
            'char(10) NOT NULL'
        ),
        self::CHECKBOX => array(
            '多选',
            'varchar(100) NOT NULL'
        ),
        self::EDITOR => array(
            '编辑器',
            'text NOT NULL'
        ),
        self::PICTURE => array(
            '上传图片',
            'int(10) UNSIGNED NOT NULL'
        ),
        self::FILE => array(
            '上传附件',
            'int(10) UNSIGNED NOT NULL'
        )
    );
    
    /**
     * 获取属性类型名称标签
     * @param string $type 为空代表
     * @return array
     */
    public static function getTypeLabel($type)
    {
        return ($type && isset(self::$types[$type])) 
                ? self::$types[$type][0] 
                : 'unknown';
    }
    
    /**
     * 返回所有属性类型列表
     * @return array
     */
    public static function getTypes()
    {
        return self::$types;
    }
    
    /**
     * 分析枚举类型字段值 格式 a:名称1,b:名称2
     * 暂时和 \DeCMF\Core\Config\Attribute\Enum::parse功能相同
     * 但请不要互相使用，后期会调整
     * @param string $string 除了标准的枚举格式,还支持函数调用:以:开头;系统设置C读取:以[ 开头（注意必须是数组）
     * @return array
     */
    public static function parseOptions($string)
    {
        if (0 === strpos($string, ':')) {
            // 采用函数定义
            return call_user_func(substr($string, 1));
        } elseif (0 === strpos($string, '[')) {
            // 支持读取配置参数（必须是数组类型）
            return C(substr($string, 1, - 1));
        }

        return Enum::parse($string);
    }

}

